package tutoria.lobao.poo.agenda;

public class AgendaContatos implements Agenda {

	private Contato[] contatos;
	private int quantidadeAtual;
	private int quantidadePosicoes;

	private final int SPOTS = 5;

	public AgendaContatos() {
		quantidadeAtual = 0;
		quantidadePosicoes = SPOTS;
		contatos = new Contato[quantidadePosicoes];
	}

	public void inserirContato(Contato contato) {
		int posicaoVazia = primeiraPosicaoVazia();

		if (!cabeMais(contatos)) {
			posicaoVazia = contatos.length;
			contatos = increaseArray(contatos, contatos.length);
		}

		contatos[posicaoVazia] = contato;
		quantidadeAtual += 1;
	}

	private int primeiraPosicaoVazia() {

		for (int i = 0; i < contatos.length; i += 1) {
			if (contatos[i] == null) {
				return i;
			}
		}

		return -1;
	}

	public Contato[] buscar(String nome) {
		if (quantidadeAtual > 0) {
			Contato[] resultados = new Contato[quantidadeAtual];

			int qtdResultados = 0;
			for (int i = 0; i < quantidadeAtual; i += 1) {
				if (nome.equalsIgnoreCase(contatos[i].getNome())) {
					if (cabeMais(resultados)) {
						resultados[qtdResultados] = contatos[i];
						qtdResultados += 1;
					}
				}
			}

			return qtdResultados > 0 ? resultados : null;
		}

		return null;
	}

	public Contato[] buscarPorTelefone(String telefone) {
		if (quantidadeAtual > 0) {
			Contato[] resultados = new Contato[quantidadeAtual];
			int qtdResultados = 0;

			for (int i = 0; i < quantidadeAtual; i += 1) {

				if (contatos[i] != null && telefone.equalsIgnoreCase(contatos[i].getTelefone())) {
					if (cabeMais(resultados)) {
						resultados[qtdResultados] = contatos[i];
						qtdResultados += 1;
					}
				}

			}
			return qtdResultados > 0 ? resultados : null;
		}

		return null;
	}

	public boolean remover(String telefone) {
		for (int i = 0; i < contatos.length; i += 1) {
			if (contatos[i] != null && telefone.equalsIgnoreCase(contatos[i].getTelefone())) {
				contatos[i] = null;
				quantidadeAtual -= 1;
				return true;
			}
		}

		return false;
	}

	public int quantidadeDeContatos() {
		return quantidadeAtual;
	}

	public Contato[] getContatos() {
		return contatos;
	}

	private Contato[] increaseArray(Contato[] lista_contatos, int quantidadeAtual) {

		Contato[] contatosAux = new Contato[quantidadeAtual + SPOTS];

		for (int i = 0; i < lista_contatos.length; i += 1) {
			contatosAux[i] = lista_contatos[i];
		}

		return contatosAux;
	}

	private boolean cabeMais(Contato[] lista_contatos) {
		return (getQuantidadeAtual(lista_contatos) != lista_contatos.length) ? true : false;
	}

	private int getQuantidadeAtual(Contato[] lista_contatos) {
		int quantidadeAtual = 0;

		for (int i = 0; i < lista_contatos.length; i += 1) {
			if (lista_contatos[i] != null) {
				quantidadeAtual += 1;
			}
		}
		return quantidadeAtual;
	}
}